home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1997 January: Mac OS SDK / Dev.CD Jan 97 SDK1.toast / Development Kits (Disc 1) / AppleScript / Development Tools / Sample Code / 7Edit 3.1 / Sources / SVAECut.c < prev    next >
Encoding:
Text File  |  1995-11-20  |  2.8 KB  |  131 lines  |  [TEXT/CWIE]

  1. // SVAECut.c
  2. //
  3. // 7Edit 3.1d1. Original version by Jon Lansdell and Nigel Humphreys.
  4. // 3.1 updates by Greg Sutton.
  5. // ©Apple Computer Inc 1995, all rights reserved.
  6.  
  7. #include "SVAECut.h"
  8.  
  9. #include "SVEditAEUtils.h"
  10. #include "SVEditWindow.h"        // for DPtrFromWindowPtr()
  11.  
  12. #include "SVAESelect.h"
  13.  
  14. #include <Scrap.h>
  15.  
  16.  
  17. #pragma segment AppleEvent
  18.  
  19. // Handle a cut to scrap e.g 'copy last word of document 1'
  20. // If no reference is given then the selection of the front window
  21. // is used.
  22.      
  23. pascal OSErr    DoCut(const AppleEvent *theAppleEvent, AppleEvent *reply, long refcon)
  24. {
  25. #pragma unused (reply, refcon)
  26.  
  27.     AEDesc        directObj = {typeNull, NULL};
  28.     TextToken    aTextToken;
  29.     short        ignore;
  30.     OSErr        err;
  31.  
  32.     err = AEGetParamDesc(theAppleEvent, keyDirectObject, typeWildCard, &directObj);
  33.     // If we get an error here it just means that they haven't supplied a reference to
  34.     // an object to cut - so cut the current section instead.
  35.     
  36.     if (directObj.descriptorType != typeNull)
  37.         err = CutDesc(&directObj);
  38.     else
  39.     {            // Just cut the selection of the front window
  40.         err = GetWindowSelection(FrontWindow(), &aTextToken, &ignore);
  41.         if (noErr != err) goto done;
  42.         
  43.         err = CutTextToken(&aTextToken);
  44.     }
  45.  
  46. done:    
  47.     if (directObj.dataHandle)
  48.         AEDisposeDesc(&directObj);
  49.         
  50.     return(err);
  51. } // DoCut
  52.  
  53.  
  54. OSErr    CutTextToken(TextToken* theToken)
  55. {
  56.     WindowPtr        aWindow;
  57.     DPtr            docPtr;
  58.     OSErr            err;
  59.     
  60.     aWindow = theToken->tokenWindow;
  61.     docPtr = DPtrFromWindowPtr(theToken->tokenWindow);
  62.     
  63.     if (! aWindow || ! docPtr)
  64.         return(errAENoSuchObject);
  65.  
  66.                     // Set this tokens selection
  67.     err = SelectTextToken(theToken);
  68.     if (noErr != err) goto done;
  69.  
  70.     err = (OSErr)ZeroScrap();
  71.     TECut(docPtr->theText);     
  72.             
  73.     docPtr->dirty = true;
  74.     AdjustScrollbars(docPtr, false);
  75.     DrawPageExtras(docPtr);
  76.     
  77. done:
  78.     return(err);
  79. }
  80.  
  81. OSErr    CutTextDesc(AEDesc* textDesc)
  82. {
  83.     TextToken        aTextToken;
  84.     Size            actualSize;
  85.     OSErr            err;
  86.  
  87.     if (typeMyText != textDesc->descriptorType)
  88.         return(errAETypeError);
  89.         
  90.     GetRawDataFromDescriptor(textDesc, (Ptr)&aTextToken, sizeof(aTextToken), &actualSize);
  91.  
  92.     err = CutTextToken(&aTextToken);
  93.     
  94.     return(err);
  95. }
  96.  
  97. OSErr    CutDesc(AEDesc* aDesc)
  98. {
  99.     AEDesc        cutDesc = {typeNull, NULL},
  100.                 textDesc = {typeNull, NULL};
  101.     OSErr        err;
  102.     
  103.     if (typeObjectSpecifier == aDesc->descriptorType)
  104.         err = AEResolve(aDesc, kAEIDoMinimum, &cutDesc);
  105.     else
  106.         err = AEDuplicateDesc(aDesc, &cutDesc);
  107.         
  108.     if (noErr != err) goto done;
  109.     
  110.     switch (cutDesc.descriptorType)
  111.     {
  112.         case typeAEList:
  113.             err = errAETypeError;
  114.             // We can't handle cutting more than one item to the scrap
  115.             break;
  116.             
  117.         default:
  118.             err = AECoerceDesc(&cutDesc, typeMyText, &textDesc);
  119.             if (noErr != err) goto done;
  120.             err = CutTextDesc(&textDesc);
  121.     }
  122.     
  123. done:
  124.     if (cutDesc.dataHandle)
  125.         AEDisposeDesc(&cutDesc);
  126.     if (textDesc.dataHandle)
  127.         AEDisposeDesc(&textDesc);
  128.     
  129.     return(err);
  130. }
  131.